<?php
namespace control;

class printClass
{
    private const title       = '打印类';
    //开源地址  https://gitee.com/wuxue107/bookjs-eazy
    /**
     * 显示打印页面
     * @param string $html 打印内容
     * @param string $direction 纸张方向  默认竖立
     * @param array $data
     * @return string
     */
    public function showPrint(string $html, $direction = 'portrait', $data = []): string
    {
        if (empty($data['direction'])) {
            $data['direction'] = $direction;
        }
        return $this->header() . $this->style() . $html . $this->printConfigure($data) . $this->footer();
    }


    /**
     * 打印配置
     * @param string $direction 纸张方向 portrait/竖向（默认）   landscape/横向
     * @param string $paperSize 纸张大小 默认A4
     * @return string $direction = 'portrait', $paperSize = 'ISO_A4'
     */


    /**
     * 指定纸张宽高和纸张类型二选一，默认使用纸张类型
     * @param array $data [‘pageSize’=>'纸张类型','direction'='纸张方向','pageSizeOption'=>['width'=>'指定纸张宽度','height'=>'指定纸张高度']]
     * @return string
     */
    public function printConfigure(array $data = []): string
    {
        $root=root;
        if (isset($data['pageSizeOption']['width']) && $data['pageSizeOption']['width']) {
            //当指定纸张宽高时
            $pageSize = "pageSizeOption : {
                                width : '{$data['pageSizeOption']['width']}', // 自定义宽高
                                height : '{$data['pageSizeOption']['height']}',
                            },";
        } else {
            if (empty($data['pageSize'])) {
                //未设置纸张类型，则默认为A4纸
                $data['pageSize'] = 'ISO_A4';
            }
            if (empty($data['direction'])) {
                //未设置纸张方向，则默认为竖向
                $data['direction'] = 'portrait';
            }
            $pageSize = "pageSize : '{$data['pageSize']}',orientation :  '{$data['direction']}',";
        }
        //页边距
        $padding = $data['padding'] ?? "10mm 10mm 10mm 10mm";
        $buttonTool = '';
        if(isset($data['hidenPrice']) && $data['hidenPrice']){
            //增加工具栏按钮
            $buttonTool.=<<<efo
                                   {
                                       id : 'hidePrice',
                                       index : 1, // 按钮位置顺序，小的显示在前面，系统内置按钮index值，见各配置项说明。
                                       icon : '{$root}img/control/hidenPrice.png',
                                       onClick : function(){ hidenPrice(); }
                                    }
efo;

        }
        $simplePageNum = <<<eof
simplePageNum : {
                                // 从第几页开始编号，默认0为第一页开始，，没有页码,也可以为一个css选择器如：".first_page"，从包含选择器接点的页面开始编号
                                pageBegin : 0,
                                // 从第几页结束编号，默认-1为最后一页结束，，没有页码,也可以为一个css选择器如：".end_page"，到包含选择器接点的页面结束编号
                                pageEnd : -1,
                                // 页面部件， 可选
                                pendant : '<div class="page-num-simple"><span style="">\${PAGE} / \${TOTAL_PAGE}</span></div>',
                            }
eof;

        if (isset($data['simplePageNum']) && !$data['simplePageNum']){
            $simplePageNum = <<<eof
simplePageNum : {
                                // 从第几页开始编号，默认0为第一页开始，，没有页码,也可以为一个css选择器如：".first_page"，从包含选择器接点的页面开始编号
                                pageBegin : 0,
                                // 从第几页结束编号，默认-1为最后一页结束，，没有页码,也可以为一个css选择器如：".end_page"，到包含选择器接点的页面结束编号
                                pageEnd : -1,
                                // 页面部件， 可选
                                pendant : '',
                            }
eof;
        }
        return <<<eof
  <script>

                        bookConfig = {
                            /**  全部纸张类型，未全量测试，常用ISO_A4
                             ISO_A0、ISO_A1、ISO_A2、ISO_A3、ISO_A4、ISO_A5
                             ISO_B0、ISO_B1、ISO_B2、ISO_B3、ISO_B4、ISO_B5、ISO_B6、ISO_B7、ISO_B8、ISO_B9、ISO_B10
                             ISO_C0、ISO_C1、ISO_C2、ISO_C3、ISO_C4、ISO_C5、ISO_C6、ISO_C7、ISO_DL、ISO_C7_6
                             JIS_B0、JIS_B1、JIS_B2、JIS_B3、JIS_B4、JIS_B5、JIS_B6、JIS_B7、JIS_B8、JIS_B9
                             NA_LEGAL、NA_LETTER、NA_LEDGER、NA_EXECUTIVE、NA_INVOICE、
                             BIG_K32
                             **/
                            // 定义纸张大小,两种方式,可选，默认：ISO_A4
                            //pageSize : '',
                            //orientation :  '', // portrait/landscape 定义纸张是竖屏/横屏放置
                            /** pageSizeOption 和 pageSize/orientation组合 ，只选其一即可 **/
                            // pageSizeOption : {
                            //     width : '241mm', // 自定义宽高
                            //     height : '140mm',
                            // },
                            {$pageSize}
                            // 可选，边距，所列选项为默认值
                            padding : '{$padding}',
                            // 可选，强制打印背景页，所列选项为默认值
                            forcePrintBackground : false,
                            // 可选，文本内容在跨页差分时，不会出现在段首的字符，所列选项为默认值
                            textNoBreakChars : ['，','。','：','”','！','？','、','；','》','】','…','.',',','!',']','}','｝'],
                            // 简易页码插件，可选（默认未开启），所列选项为开启时的默认值
                            $simplePageNum,

                            // 目录插件，可选（默认未开启），所列选项为开启时的默认值
                            // simpleCatalog : {
                            //     titlesSelector : 'h1,h2,h3,h4,h5,h6', // 可选，作为目录标题的选择器，按目录级别依次
                            //     showSlide : false, // 可选，是否显示侧边栏，目录导航，工具栏按钮顺序index: 200
                            //     slideOn : false, // 可选，目录导航，默认是否打开状态
                            //
                            //     showOnPage : false, // 可选，是否在页面中插入目录，默认，插入目录到页面
                            //     header : '<div class="catalog-title">目 录111</div>', // 可选，目录页Header部分，放入你想加入的一切
                            //     itemFillChar : '…', // 可选，目录项填充字符, ""空字符串，不填充，使用自定义makeItem时，忽略该选项配置
                            //     positionSelector : '.nop-page-item-pagenum-1', //可选，目录位置会插入在匹配页的之前，默认为第一个编号页前
                            //     // 可选，自定义目录项。
                            //     makeItem : function(itemEl,itemInfo) {
                            //         /**
                            //          * @var itemEl jQuery Element
                            //          * @var object itemInfo PS: {title, pageNum, level,linkId}
                            //          **/
                            //         return '<div>自定义的目录项html内容，根据itemInfo自己构造</div>';
                            //     }
                            // },

                            // 工具栏插件，可选（默认开启），所列选项为开启时的默认值
                            toolBar : {
                                // Web打印按钮功能可选，默认true, 按钮顺序index: 100
                                webPrint : true,
                                /**
                                 * HTML保存按钮，可选，bool|object，默认false:禁用保存HTML功能，true:启用并使用默认选项
                                 * 按钮顺序index: 300
                                 * saveHtml : {
                                 *     // 可选，保存的文件名，默认值: document.title + '.html'
                                 *     fileName : 'output.html',
                                 *     // 可选，自定义下载保存。可用于混合APP内下载时用
                                 *     save : function(getStaticHtmlPromiseFunc,fileName){
                                 *         getStaticHtmlPromiseFunc().then(function(htmlBlob){
                                 *             ...
                                 *         })
                                 *     }
                                 * }
                                 */
                                saveHtml : false,
                                /**
                                 * 服务端打印下载按钮，按钮顺序index: 400
                                 * 可选，bool|object，默认false:不启用,true:启用并使用默认选项,object:使用自定义的服务端打印
                                 * true等效的object的配置：serverPrint : { serverUrl : '/' },
                                 * 官网可用serverUrl : '//bookjs.zhouwuxue.com/'
                                 * 要使用serverPrint,必须server能访问到你的网页。网页不要使用登录状态授权，建议通过URL参数传递临时授权
                                 * 如果使用官方的server进行打印，则需公网上可正确访问你用bookjs-eazy构造的网页
                                 *
                                 * serverPrint : {
                                 *     // 可选，打印服务器地址,按钮顺序index: 400
                                 *     serverUrl : '/',
                                 *     // 可选，保存的文件名，默认值 document.title + '.pdf'
                                 *     fileName : 'output.pdf',
                                 *     // 可选，打印附属参数
                                 *     params : {
                                 *         // 打印超时时间
                                 *         timeout : 30000,
                                 *         // 页面渲染完成后，打印前延时
                                 *         delay : 1000,
                                 *     },
                                 *     // 可选，自定义下载。可用于混合APP内下载时用
                                 *     save : function(pdfUrl, serverPrintOption){
                                 *
                                 *     }
                                 * }
                                 */
                                serverPrint : false,

                                buttons:[{$buttonTool}]
                            },
                            // 重要
                            // 当这个值为true时，页面才开始渲染。如果你的页面是动态的，
                            // 就先将默认值设为false,当下节所述中的#content-box节点内容准备好后，在将其设为true，
                            // bookConfig.start = true;
                                        start : false,
                        }
                        $(function (){
                            setTimeout(function() {
                              bookConfig.start = true;
                            },2000)
                        })
                    </script>
eof;
    }

    /**
     * 头部
     * @return string
     */
    public function header(): string
    {
        $root = root;
        $title = para('title');//网站标题
        $version = version;
        return <<<eof
                <html lang="zh">
                <head>
                <title>{$title}</title>
                    <meta charset="UTF-8">
                    <link rel="stylesheet" type="text/css" href="{$root}static/stylesheet/css.css?v={$version}">
                    <script src="{$root}static/javascript/jquery-1.11.2.min.js"></script>
                    <script src="{$root}static/javascript/polyfill.min.js"></script>
                     <script src="{$root}static/javascript/lodash.min.js"></script>
                     <script src="{$root}static/javascript/js.js?v={$version}"></script>
                    <script src="{$root}static/javascript/bookjs-eazy.min.js"></script>
                    <link rel="icon" type="image/x-icon" href="{$root}favicon.ico?v=4.2.710">
                </head>
                <body>
eof;
    }

    /**
     *尾部
     * @return string
     */
    public function footer(): string
    {
        return <<<eof
            <script>
            /**隐藏价格***/
            function hidenPrice(){
                let url = window.location.href;
                 if(GetQueryString('price')==='hidden'){
                    url=  urlHelper.delUrlParam(url,'price');
                 }else{
                     url= urlHelper.addUrlParam(url,'price','hidden');
                 }
                 window.location.href = url;
            }
            $(function() {
               if (GetQueryString('price') ==='hidden'){
                   $(".table-top-title").hide();
               }else{
                   $(".table-top-title").show();
               }
            })
            </script>
            </body>
            </html>
eof;
    }

    /**
     * 打印样式
     * @return string
     */
    public function style(): string
    {
        return <<<eof
        <style>
        body {color: #000;background-color: #999;font-family: "Microsoft YaHei UI", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";}
        .pendant-title{position: absolute;color: #666666;top: 1cm;left: 1cm;}
        .printTable .have_border td {border: solid black 1px;}
        .printTable .have_border th {border: solid black 1px;padding: 5px}
        .printTable{border-collapse: collapse;font-size: 14px;width: 100%}
        .printTitle{width: 100%;text-align: center;font-size: 16px;margin-top: 20px;}
        .printSubTitle {width: 100%;text-align: center;font-size: 16px;font-weight: 800;margin-top: 20px;}
        @media print {.printTable {page-break-after: always;}
        .printTable th {padding: 5px;font-size: 14px;}
        .printTable .have_border td {border: solid black 1px;}
        .printTable .have_border th {border: solid black 1px;}
        .printTable {border-collapse: collapse;width: 100%}
        .printTitle{width: 100%;text-align: center;font-size: 16px;margin-top: 20px;}
        .printSubTitle {width: 100%;text-align: center;font-size: 16px;font-weight: 700;margin-top: 20px;}}
        </style>
eof;
    }
}
